import { Ray } from "./rayUtil"
import type { Vec3 } from "./vectorUtil"

/**
 * 相机类
 */
export class Camera {

  /** 相机的位置 在屏幕前面*/
  origin: Vec3

  /** 画布的左下角原点位置 */
  leftBottom: Vec3

  /** 画布垂直向量包含长度 */
  vertical: Vec3

  /** 画布水平向量包含长度 */
  horizontal: Vec3


  constructor(origin: Vec3, leftBottom: Vec3, horizontal: Vec3, vertical: Vec3) {
    this.origin = origin
    this.vertical = vertical
    this.leftBottom = leftBottom
    this.horizontal = horizontal
  }

  /**
   * 获得光线，从相机原点出发，到达像素点的光线
   * @param x  水平比例
   * @param y  垂直比例
   * @returns 
   */
  getRay(x: number, y: number): Ray {
    // 从画布原点，水平比例x，垂直比例y，得到画布像素的位置点
    // 使用向量减法，得到一个从原点指向像素位置的光线
    const direction = this.leftBottom
      .add(this.horizontal.mul(x))
      .add(this.vertical.mul(y))
      .sub(this.origin)
    return new Ray(this.origin, direction)
  }
}